﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Runtime.Serialization;

namespace RiskMan.DataClass.Models.Level
{
    [Serializable]
    public class TrendItem : INotifyPropertyChanged, ISerializable
    {

        private string _nameTrend;
        private double _priceLevel;
        private int _trendCandleCount;
        private double _stepTrendCandle;
        private double _curTrendPrice;
        private double _horizontalLevel;
        private DateTime _dateTimeFirstCandle;
        private double _priceFirstCandle;
        private DateTime _dateTimeSecondCandle;
        private double _priceSecondCandle;
        private string _interval;

        private double _minProkol;
        private double _maxProkol;
        private int _timeFalseProboi;
        private bool _flagProboiLevel;
        private bool _flagDiapazonLevel;
        private DateTime _flagTimePeroid;

        private double _upLevel;
        private double _downLevel;

        #region public

        
        /// <summary>
        /// Цена уровня тренда
        /// </summary>
        public double CurTrendPrice
        {
            get { return _curTrendPrice; }
            set
            {
                if (_curTrendPrice != value)
                {
                    _curTrendPrice = value;
                    RaisePropertyChanged("CurTrendPrice");
                }
            }
        }
           
        /// <summary>
        /// Шаг тренда на свечу
        /// </summary>
        public double StepTrendCandle
        {
            get { return _stepTrendCandle; }
            set
            {
                if (_stepTrendCandle != value)
                {
                    _stepTrendCandle = value;
                    RaisePropertyChanged("StepTrendCandle");
                }
            }
        }
           
        /// <summary>
        /// Количество свечей между заданными датами, для расчета шага тренда на свечу
        /// </summary>
        public int TrendCandleCount
        {
            get { return _trendCandleCount; }
            set
            {
                if (_trendCandleCount != value)
                {
                    _trendCandleCount = value;
                    RaisePropertyChanged("TrendCandleCount");
                }
            }
        }
           
        /// <summary>
        /// цена уровня на текущий момент
        /// </summary>
        public double PriceLevel
        {
            get { return _priceLevel; }
            set
            {
                if (_priceLevel != value)
                {
                    _priceLevel = value;
                    RaisePropertyChanged("PriceLevel");
                }
            }
        }
           

        /// <summary>
        /// Верхний уровень для работы по стратегии двойной уровень
        /// </summary>
        public double UpLevel
        {
            get { return _upLevel; }
            set
            {
                if (_upLevel != value)
                {
                    _upLevel = value;
                    RaisePropertyChanged("UpLevel");
                }
            }
        }
        /// <summary>
        /// Нижний уровень для работы по стратегии двойной уровень
        /// </summary>
        public double DownLevel
        {
            get { return _downLevel; }
            set
            {
                if (_downLevel != value)
                {
                    _downLevel = value;
                    RaisePropertyChanged("DownLevel");
                }
            }
        }

        /// <summary>
        /// Время нахождения цены за уровень, после пробития его
        /// </summary>
        public DateTime FlagTimePeroid
        {
            get { return _flagTimePeroid; }
            set
            {
                if (_flagTimePeroid != value)
                {
                    _flagTimePeroid = value;
                    RaisePropertyChanged("FlagTimePeroid");
                }
            }
        }

        /// <summary>
        /// Приход в зону минимального максимального прокола и времени нахождения
        /// </summary>
        public bool FlagDiapazonLevel
        {
            get { return _flagDiapazonLevel; }
            set
            {
                if (_flagDiapazonLevel != value)
                {
                    _flagDiapazonLevel = value;
                    RaisePropertyChanged("FlagDiapazonLevel");
                }
            }
        }

        /// <summary>
        /// Пробой уровня при стратегии ложный пробой
        /// </summary>
        public bool FlagProboiLevel
        {
            get { return _flagProboiLevel; }
            set
            {
                if (_flagProboiLevel != value)
                {
                    _flagProboiLevel = value;
                    RaisePropertyChanged("FlagProboiLevel");
                }
            }
        }

        /// <summary>
        /// Минимальная величина, на которую должна пробить цена до возврата обратно к уровню
        /// </summary>
        public double MinProkol
        {
            get { return _minProkol; }
            set
            {
                if (_minProkol != value)
                {
                    _minProkol = value;
                    RaisePropertyChanged("MinProkol");
                }
            }
        }

        /// <summary>
        /// Максимальная величина, на которую может пробить цена до возврата обратно к уровню
        /// </summary>
        public double MaxProkol
        {
            get { return _maxProkol; }
            set
            {
                if (_maxProkol != value)
                {
                    _maxProkol = value;
                    RaisePropertyChanged("MaxProkol");
                }
            }
        }

        /// <summary>
        /// Время нахождения цены ниже уровня и до возврата обратно
        /// </summary>
        public int TimeFalseProboi
        {
            get { return _timeFalseProboi; }
            set
            {
                if (_timeFalseProboi != value)
                {
                    _timeFalseProboi = value;
                    RaisePropertyChanged("TimeFalseProboi");
                }
            }
        }


        /// <summary>
        /// Название тренда
        /// </summary>
        public string NameTrend
        {
            get { return _nameTrend; }
            set
            {
                if (_nameTrend != value)
                {
                    _nameTrend = value;
                    RaisePropertyChanged("NameTrend");
                }
            }
        }

        /// <summary>
        /// Горизонтальный уровень тренда
        /// </summary>
        public double HorizontalLevel
        {
            get { return _horizontalLevel; }
            set
            {
                if (_horizontalLevel != value)
                {
                    _horizontalLevel = value;
                    RaisePropertyChanged("HorizontalLevel");
                }
            }
        }

        /// <summary>
        /// дата первой свечи для расчет линии тренда
        /// </summary>
        public DateTime DateTimeFirstCandle
        {
            get { return _dateTimeFirstCandle; }
            set
            {
                if (_dateTimeFirstCandle != value)
                {
                    _dateTimeFirstCandle = value;
                    RaisePropertyChanged("DateTimeFirstCandle");
                }
            }
        }

        /// <summary>
        /// цена на первой свечи
        /// </summary>
        public double PriceFirstCandle
        {
            get { return _priceFirstCandle; }
            set
            {
                if (_priceFirstCandle != value)
                {
                    _priceFirstCandle = value;
                    RaisePropertyChanged("PriceFirstCandle");
                }
            }
        }



        /// <summary>
        /// дата второй свечи для расчет линии тренда
        /// </summary>
        public DateTime DateTimeSecondCandle
        {
            get { return _dateTimeSecondCandle; }
            set
            {
                if (_dateTimeSecondCandle != value)
                {
                    _dateTimeSecondCandle = value;
                    RaisePropertyChanged("DateTimeSecondCandle");
                }
            }
        }

        /// <summary>
        /// цена на второй свечи
        /// </summary>
        public double PriceSecondCandle
        {
            get { return _priceSecondCandle; }
            set
            {
                if (_priceSecondCandle != value)
                {
                    _priceSecondCandle = value;
                    RaisePropertyChanged("PriceSecondCandle");
                }
            }
        }

        /// <summary>
        /// интервал графика
        /// </summary>
        public string Interval
        {
            get { return _interval; }
            set
            {
                if (_interval != value)
                {
                    _interval = value;
                    RaisePropertyChanged("Interval");
                }
            }
        } 
        #endregion

        public TrendItem() { }

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        public TrendItem(SerializationInfo info, StreamingContext context)
        {
            NameTrend = info.GetString("NameTrend");
            HorizontalLevel = info.GetDouble("HorizontalLevel");
            DateTimeFirstCandle = info.GetDateTime("DateTimeFirstCandle");
            PriceFirstCandle = info.GetDouble("PriceFirstCandle");
            DateTimeSecondCandle = info.GetDateTime("DateTimeSecondCandle");
            PriceSecondCandle = info.GetDouble("PriceSecondCandle");
            Interval = info.GetString("Interval");

            MinProkol = info.GetDouble("MinProkol");
            MaxProkol = info.GetDouble("MaxProkol");
            TimeFalseProboi = info.GetInt32("TimeFalseProboi");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("NameTrend", NameTrend);
            info.AddValue("HorizontalLevel", HorizontalLevel);
            info.AddValue("DateTimeFirstCandle", DateTimeFirstCandle);
            info.AddValue("PriceFirstCandle", PriceFirstCandle);
            info.AddValue("DateTimeSecondCandle", DateTimeSecondCandle);
            info.AddValue("PriceSecondCandle", PriceSecondCandle);
            info.AddValue("Interval", Interval);
            info.AddValue("MinProkol", MinProkol);
            info.AddValue("MaxProkol", MaxProkol);
            info.AddValue("TimeFalseProboi", TimeFalseProboi);

        }
    }
}
